<?php
class Crawl_html_library extends Crawl_abstract{
    const   PLATFORM = 'other';
    const   LOG_DIR = 'get_page';
    const   USE_PROXY = 'use';
    public $_parameters;
    public $_get_parameters;
    function __construct() {
        parent::__construct();
        $this->_ci->config->load('openplatforms', TRUE);
        $this->_platform = self::PLATFORM;
        $this->_log_dir = self::LOG_DIR;
        $this->_result_log_dir = $this->_log_dir.'/'.$this->_result_log_dir;
    }

    /**
     * 使用代理IP抓取数据
     * @param $parameters             抓取使用的参数 array
     * @param string $use_proxy       代理IP模式 string  proxy(代理IP) or mobility(动态ADSL)
     * @param $crawl_from             抓取目标   string  (目标平台)
     * @return array|string           返回抓取结果，成功 string 抓取数据不完整 array 抓取错误 array
     */
    public function crawl_use_proxy_ip($parameters, $use_proxy = self::PRROXY_IP, $crawl_from) {
        $parameters['crawl_from'] = $crawl_from;
        //以 $use_proxy 指定的代理模式 开始抓取 即使用代理IP或者动态ADSL IP
        $try_crawl_use_proxy = self::get_content($parameters, $use_proxy);
        //如果验证结果返回错误信息
        if(is_array($try_crawl_use_proxy) && array_key_exists($this->_error_string,$try_crawl_use_proxy)) {
            //抓取失败
            log_message(self::LOG_LEVEL_WARING, 'Try Crawl From '.$crawl_from.' Use '.$use_proxy.' Failed:'.json_encode($this->return_utf8_code($try_crawl_use_proxy)), FALSE, $this->_log_dir);
            //肉鸡抓取开始重试
            log_message(self::LOG_LEVEL_NOTICE, 'Will Crawl From '.$crawl_from.' Use Retry And Use '.$use_proxy.' With Parameters: '.json_encode($parameters), FALSE, $this->_log_dir);
            //尝试以 $use_proxy 指定的代理模式 重试
            $retry_result = $this->retry_crawl($parameters, $use_proxy, $crawl_from );
            //如果重试存在错误
            if(is_array($retry_result) && array_key_exists($this->_error_string, $retry_result)) {
                log_message(self::LOG_LEVEL_WARING, 'Crawl From '.$crawl_from.' Use '.$use_proxy.' Failed:'.json_encode($this->return_utf8_code($retry_result)), FALSE, $this->_log_dir);
            } else {
                //返回重试抓取结果
                $log_string = is_array($retry_result) ? json_encode($this->return_utf8_code($retry_result)) : $retry_result;
                log_message(self::LOG_LEVEL_NOTICE, 'Retry Crawl '.$crawl_from.' Use '.$use_proxy.' IP result: '.$log_string, FALSE, $this->_result_log_dir);
            }

            return $retry_result;
        } else {
            //返回 肉鸡抓取结果
            $log_string = is_array($try_crawl_use_proxy) ? json_encode($this->return_utf8_code($try_crawl_use_proxy)) : $try_crawl_use_proxy;
            log_message(self::LOG_LEVEL_NOTICE, 'Crawl From '.$crawl_from.' Use Proxy IP result: '.$log_string, FALSE, $this->_result_log_dir);
            return $try_crawl_use_proxy;
        }
    }

    /**
     * 抓取重试
     * @param $parameters               抓取使用的参数 array
     * @param string $use_proxy         代理IP模式 string  proxy(代理IP) or mobility(动态ADSL)
     * @param $crawl_from               抓取目标   string  (目标平台)
     * @return array|string             返回抓取结果，成功 string 抓取数据不完整 array 抓取错误 array
     */
    public function retry_crawl($parameters,$use_proxy = self::PRROXY_IP, $crawl_from) {
        $retry_time = $this->_ci->config->item('try_times');
        if(!is_array($retry_time) || !array_key_exists($use_proxy, $retry_time)) {
            return $this->_ci->error_code_library->getError('system', 'params', 'no_must_parameter', 'ReTry Times');
        }
        for($i = 0; $i < $retry_time[$use_proxy]; $i++) {
            log_message(self::LOG_LEVEL_NOTICE, 'Will Retry '.($i+1).' Crawl '.$crawl_from.' Use '.$use_proxy.' With Parameters: '.json_encode($parameters), FALSE, $this->_log_dir);
            //以 $use_proxy 指定的代理模式 开始抓取 即使用代理IP或者动态ADSL IP
            $crawl_result = self::get_content($parameters, $use_proxy);
            if(is_array($crawl_result) && array_key_exists($this->_error_string, $crawl_result)) {
                log_message('waring', 'Retry '.($i+1).' Crawl '.$crawl_from.' Use Proxy Failed: '.json_encode($this->return_utf8_code($crawl_result)), FALSE, $this->_log_dir);
            } else {
                return $crawl_result;
            }
        }
        return $crawl_result;
    }

    public function get_basic_parameters($proxy_from) {
        $data['token'] = $this->_get_parameters['token'];
        $data['key_word'] = $this->_parameters['url'];
        $data['page'] = 0;
        $data['key_word_hash'] = md5($this->_parameters['url']);
        $data['key_word_page_hash'] = 0;
        $data['original_page'] = 0;
        $data['platform'] = $this->_platform;
        $data['start_time'] = time();
        $data['ip_type'] = $proxy_from;
        return $data;
    }
}